package com.jt.consumer.controller;

/**
 * @author CCFu
 * @version 1.0
 * @date 2022/1/17 15:48
 */

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.sql.SQLOutput;

/**
 * 定义服务消费端Controller,在这个Controller对象
 * 的方法中实现对远端服务sca-provider的调用
 */
@RestController
public class ConsumerController {
    /**
     * 从spring容器获取一个RestTemplate对象,
     * 基于此对象实现远端服务调用
     */
    @Autowired
    private RestTemplate restTemplate;

    /**
     *  /**
     *      此对象负责实现对远程服务进行负载均衡方式的获取,
     *      底层默认基于Ribbon组件(负载均衡组件)中内置算法(轮询,随机,hash,...)获取某个服务实例.
     *      说明:这个对象是我们项目添加了spring cloud以后,系统启动时会自动创建这个对象,
     *      所以我们需要时,直接从spring容器获取即可.
     *
     */
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    /**
     * 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
     * @return
     * 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
     */
    @Value("${server.port:8091}")
    private String serverPort;

    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho01(){
//        //1.定义要调用的远端服务的url
//        String url="http://localhost:8081/provider/echo/8090";
//        //2.基于restTemplate对象中的相关方法进行服务调用
//        return restTemplate.getForObject(url, String.class);
        //1.定义要调用的远端服务的url
//        String url1="http://localhost:8081/provider/echo/{msg}";
//        String url2="http://localhost:8082/provider/echo/{msg}";
//        //2.基于restTemplate对象中的相关方法进行服务调用
//        String[] urls = {url1,url2};
        //String url = urls[new Random().nextInt(urls.length)];
//        return restTemplate.getForObject(url, String.class,serverPort);
        ServiceInstance serviceInstance = loadBalancerClient.choose("sca-provider");
        String ip = serviceInstance.getHost();
        int port = serviceInstance.getPort();
        //用“+”方式拼接字符串
        //String url = "http://"+ip+":"+port+"8082/provider/echo/{msg}";
        //用占位符方式构建url字符串，%s表示字符串占位符
        String url = String.format("http://%s:%s/provider/echo/{msg}",serviceInstance.getHost(),serviceInstance.getPort());
//        System.out.println("hello"+ip);
//        System.out.printf("hello %s",ip);

        return restTemplate.getForObject(url, String.class,serverPort);
    }



    @Autowired
    private RestTemplate loadBalancedRestTemplate;
    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho02() {
        String url = String.format("http://%s/provider/echo/{msg}","sca-provider");
        //当在这里进行远程服务调用(RPC)是,底层会这个请求进行拦截,
        //然后基于LoadBalancerClient对象通过服务名获取具体的服务实例(ServiceInstance)
        return loadBalancedRestTemplate.getForObject(url, String.class,serverPort);
    }

}

